from flask import (
    render_template, request, session, redirect
)
from werkzeug.utils import secure_filename
from functools import update_wrapper

import os

from App import app, db
from App.models import (
    User, Block, LogsDb
)
from utils.getDish import (
    getData, get_name
)
from utils.hashlib_md5_func import set_md5

# 删除/创建数据库
# db.drop_all()
db.create_all()

"""
除了登录注册主页，其他页面都需要登录之后才能进行观看使用
"""

# 校验session
def warps(func):
    """
    装饰器，用来校验用户请求这个网页之前有没有登录过，如果没有登录过就会跳转到登录界面
    :param func:
    :return:
    """
    def inner(*args, **kwargs):
        if session.get("username"):
            ret = func(*args, **kwargs)
            return ret
        else:
            return redirect("/login")

    update_wrapper(inner, func)
    return inner


@app.route('/')
def index():
    """
    登录页面视图函数
    :return: index页面
    """
    return render_template('index.html')


@app.route('/hot')
@warps
def hot():
    """
    热榜视图函数
    :return: 热榜页面
    """
    blocks = Block.getBlocks()
    return render_template('hot.html', blocks=blocks)

@app.route('/todo')
def todo():
    return render_template('todo.html')

@app.route('/log')
@warps
def log():
    """
    日志系统视图函数
    :return: viewlog.html
    """
    the_row_titles = ["用户名称", "用户搜索结果", "用户ip", "请求头"]
    logs = LogsDb.getLogs()
    return render_template("viewlog.html", the_row_titles=the_row_titles, logs=logs)


@app.route('/login', methods=["GET", "POST"])
def login():
    """
    登录界面试图函数，如果用户成功登录那么就会注入session，方便后面进行判断用户有没有登录过
    :return: 如果成功就返回index页面，如果没有成功就继续登录
    """
    if request.method == "GET":
        return render_template("sign_up.html")
    else:
        user_info = request.form.to_dict()
        username = user_info["username"]
        password = set_md5(user_info["password"])
        flag = User.haveUser(username, password)
        if flag:
            session["username"] = username
            return redirect("/")
        else:
            return render_template("sign_up.html", tips="登录失败")


@app.route('/reg', methods=["GET", "POST"])
def register():
    """
    注册功能的视图函数，用户通过提交form表单到后端进行判断
    用户的密码会使用MD5加密存储
    :return: 如果注册成功会返回登录界面，注册失败会返回注册界面继续注册
    """
    if request.method == "GET":
        return render_template("sign_in.html")
    else:
        user_info = request.form.to_dict()
        username = user_info["username"]
        password = set_md5(user_info["password"])  # 密码通过MD5加密
        flag = User.addUser(name=username, password=password)
        if flag == 0:
            print("用户注册成功")
            return render_template("sign_up.html")  # 去登录
        else:
            print("注册失败，原因有很多，我具体也不知道")
            return render_template("sign_in.html", tips="注册失败，请重新注册")


@app.route('/upload', methods=['POST', 'GET'])
@warps
def upload():
    """
    用户上传照片进行分析的视图函数
    :return:
    """
    if request.method == 'POST':
        f = request.files['file']
        print(f.filename)
        basepath = os.path.dirname(__file__)  # 当前文件所在路径
        upload_path = os.path.join(basepath, 'static//uploads',
                                   secure_filename(f.filename))  # 注意：没有的文件夹一定要先创建，不然会提示没有该路径

        f.save(upload_path)
        dish_name = get_name(upload_path)
        title, zuofa_str, cailiao_str = getData(dish_name)

        # 在log数据库中添加数据103.96.74.28
        LogsDb.addLogs(username=session.get("username"),
                       search_result=title,
                       user_agent=request.user_agent,
                       ip=request.remote_addr)

        return render_template('dish.html', title=title, zuofa_str=zuofa_str, cailiao_str=cailiao_str)
    else:
        return render_template("search_dish.html")


if __name__ == '__main__':
    app.run(port=8000, debug=True,host="0.0.0.0")
